package com.carlinfo.shop.goods.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.Callable;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.carlinfo.shop.common.util.ConstatFinalUtil;
import com.carlinfo.shop.common.util.ExecutorServiceUtil;
import com.carlinfo.shop.common.util.JdSpider;
import com.carlinfo.shop.common.util.PageInfoUtil;
import com.carlinfo.shop.goods.pojo.AGoods;
import com.carlinfo.shop.goods.pojo.AGoodsEnum;
import com.carlinfo.shop.goods.service.IGoodsService;
import com.carlinfo.shop.goods.service.IGoodsSpiderService;
import com.carlinfo.shop.util.GoodsCallable;

@Service("goodsSpiderService")
public class GoodsSpiderServiceImpl implements IGoodsSpiderService
{
	@Resource
	private IGoodsService goodsService;
	
	/**
	 * 先不考虑京东如何采集数据
	 * 
	 * 那肯定是先获取总页数,(总共是56页)
	 * 肯定有6个线程;(那如何分配呢?)
	 * 		1:		1-->10
	 * 		2:		11-->20
	 * 		3:		21-->30
	 * 		4:		31-->40
	 * 		5:		41-->50
	 * 		6:		51-->56
	 */
	@Override
	public void operSpiderJdService(String cate,String ev,int cateId)
	{
		JdSpider jdSpider = new JdSpider();
		/* 任何一页都可以获取到总页数 */
		JSONObject resultJSON = jdSpider.goodsList(cate,ev, 1);
		/* 总共要采集的页数 */
		int totalTaskPage = 0;
		if("0".equalsIgnoreCase(resultJSON.getString("code")))
		{
			JSONObject dataJSON = (JSONObject) resultJSON.get("data");
			JSONObject pageInfoJSON = (JSONObject) dataJSON.get("pageInfo");
			totalTaskPage = Integer.valueOf(pageInfoJSON.get("totalPage") + "");
		}
		/* 每个线程采集10页 */
		int pageTaskSize = 10 ;
		/* 需要多少个线程来采集完数据 */
		PageInfoUtil pageInfoUtil = new PageInfoUtil() ; 
		pageInfoUtil.setTotalRecord(totalTaskPage);
		pageInfoUtil.setPageSize(pageTaskSize);
		ConstatFinalUtil.LOGGER.info("====>" + pageInfoUtil.getTotalPage());
		
		/* 存放线程的容器 */
		List<Callable<Object>> goodsCallablList = new ArrayList<Callable<Object>>();
		
		/* 这6个人,干的活不能重复 */
		for (int i = 1; i <= pageInfoUtil.getTotalPage(); i++)
		/*for (int i = 1; i <= 2; i++)*/
		{
			pageInfoUtil.setCurrentPage(i);
			ConstatFinalUtil.LOGGER.info("人的编号:{},任务编号:{},任务数量:{}",pageInfoUtil.getCurrentPage(),
					pageInfoUtil.getCurrentRecord() , pageInfoUtil.getPageSize());
			/* 每个任务应该做什么 */
			int edPage = pageInfoUtil.getCurrentRecord() + pageInfoUtil.getPageSize() ; 
			if(edPage > pageInfoUtil.getTotalRecord())
			{
				edPage = pageInfoUtil.getTotalRecord();
			}
			/*this.perTask(cate, cateId,pageInfoUtil.getCurrentRecord(), edPage);*/
			/* 启用多线程 */
			GoodsCallable goodsCallable = new GoodsCallable() ; 
			
			/* 线程一定得赋值 */
			goodsCallable.setOperType("spiderJD");
			/* 为Service赋值一定得是Spring中有的值 */
			goodsCallable.setGoodsSpiderService(this);
			/* 所有的参数 */
			Map<String, Object> paramsMap = new HashMap<String, Object>();
			paramsMap.put("cate", cate);
			paramsMap.put("ev", ev);
			paramsMap.put("cateId", cateId);
			paramsMap.put("stPage", pageInfoUtil.getCurrentRecord());
			paramsMap.put("edPage", edPage);
			goodsCallable.setParamsMap(paramsMap);
			goodsCallablList.add(goodsCallable);
			try
			{
				/* 线程休眠 */
				Thread.sleep(1000);
			} catch (InterruptedException e)
			{
			}
		}
		/* main方法等待
		 * 整个web项目,线程池只能启动一次,一旦启动不要关闭
		 *  */
		ExecutorServiceUtil.invokeAll(goodsCallablList);
	}
	
	/*
	 * 每个任务
	 * 采集京东的时候,需要一个分类和当前页
	 */
	public void perTask(String cate,String ev,int cateId , int stPage,int edPage)
	{
		JdSpider jdSpider = new JdSpider();
		Map<String, Object> condMap = new HashMap<String, Object>();
		for(int i = stPage ; i < edPage ; i ++)
		{
			int jdPage = i + 1 ; 
			ConstatFinalUtil.LOGGER.info("京东正在采集的页数:{}",jdPage);
			/* 采集数据 */
			JSONObject resultJSON = jdSpider.goodsList(cate,ev, jdPage);
			if("0".equalsIgnoreCase(resultJSON.getString("code")))
			{
				JSONObject dataJSON = (JSONObject) resultJSON.get("data");
				JSONArray goodsArr = (JSONArray) dataJSON.get("goods");
				for (Iterator<?> iterator = goodsArr.iterator(); iterator.hasNext();)
				{
					JSONObject goodsJSON = (JSONObject) iterator.next();
					String name = goodsJSON.getString("name");
					String imgPath = goodsJSON.getString("imgPath");
					String price = goodsJSON.getString("price");
					String href = goodsJSON.getString("href");
					
					String outType = "1" ; 
					String outerId = goodsJSON.getString("id") ; 
					/* 根据id和类型查询商品
					 * 如果查询到,直接更新,
					 * 如果查询不到,直接保存
					 *  */
					condMap.put("outerType", outType);
					condMap.put("outerId", outerId);
					/* 准备一下对象,入库吧 */
					AGoods goods = this.goodsService.findOneGoodsService(condMap); 
					
					/* 断言
					 * 假设肯定 是更新
					 * */
					boolean updateFlag = true ; 
					if(goods == null)
					{
						goods = new AGoods() ; 
						goods.setCreateTime(new Date());
						updateFlag = false ; 
					}
					
					goods.setName(name);
					goods.setTitle(name);
					/* -1:表示是采集的系统 */
					goods.setAdminsId(-1);
					goods.setUrl("url_" + outerId);
					
					goods.setCateId(cateId);
					goods.setListImgPath(imgPath);
					
					goods.setPrice(Double.valueOf(price));
					goods.setMarketPrice(Double.valueOf(price));
					
					/* 商品的状态:0:禁用,1:启用
					 * 前台显示全部是启用;
					 * 采集的数据一定全部设置为禁用;
					 * 每隔一段时间,将随机的商品由禁用变成启用;
					 * (给搜索引擎一个假象:这个商城有人维护)
					 *  */
					goods.setContent("这是内容:" + name);
					
					goods.setOuterType(Byte.valueOf(outType));
					goods.setOuterId(outerId);
					
					goods.setUpdateTime(new Date());
					goods.setPubTime(new Date());
					
					/* 如果采集过的数据,又采集一遍;直接入库;
					 * 同一份数据采集两遍
					 * 如果数据存在,就更新,不存在,就保存
					 *  */
					if(updateFlag)
					{
						/* 入库 */
						this.goodsService.updateOneGoodsService(goods);
					}else
					{
						/* 入库 */
						this.goodsService.saveOneGoodsService(goods);
					}
				}
			}
		}
	}

	@Override
	public void operOpenGoods()
	{
		/* 随机开放10-->20件商品 */
		Random random = new Random() ; 
		/*for(int i = 0 ; i < 20 ; i ++)
		{
			 商品数量 
			int num = random.nextInt(10) + 10 ;
			ConstatFinalUtil.LOGGER.info("随机商品数量:{}",num);
		}*/
		/*
		 * 查询的数量是12条
		 * 分页查询第一页,每页12条
		 *  */
		int num = random.nextInt(10) + 10 ;
		/* 查询指定数量的商品(状态为禁用) */
		Map<String, Object> condMap = new HashMap<String, Object>();
		condMap.clear();
		condMap.put("status", AGoodsEnum.STATUS_DISABLE.getStatus());
		
		PageInfoUtil pageInfoUtil = new PageInfoUtil() ; 
		pageInfoUtil.setCurrentPage(1);
		pageInfoUtil.setPageSize(num);
		Map<String, Object> resultMap = this.goodsService.findCondListGoodsService(pageInfoUtil, condMap);
		/* 取出商品数量 */
		List<AGoods> goodsList = (List<AGoods>) resultMap.get("list");
		for (Iterator iterator = goodsList.iterator(); iterator.hasNext();)
		{
			AGoods goods = (AGoods) iterator.next();
			goods.setStatus(AGoodsEnum.STATUS_ENABLE.getStatus());
			goods.setUpdateTime(new Date());
			this.goodsService.updateOneGoodsService(goods);
		}
		ConstatFinalUtil.LOGGER.info("开放商品数量:{},未开放数量:{}",num,pageInfoUtil.getTotalRecord());
	}
}
